package com.dupf.common.base.redis;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.support.atomic.RedisAtomicLong;

import java.io.Serializable;
import java.util.Date;
import java.util.concurrent.TimeUnit;

/**
 * redis生成订单编号尾号
 * @author 赵涛
 */
public class RedisSequenceFactory {
    @Autowired
    @Qualifier("redisTemplate")
    private RedisTemplate<String, Serializable> mRedisTemp;

    /**
     * 设置原子自增长的key-value
     * @param key 名称
     * @param value 设置的值
     * @param expireTime 超时时间
     */
    public void set(String key,int value,Date expireTime) {
        RedisAtomicLong counter = new RedisAtomicLong(key, mRedisTemp.getConnectionFactory());
        counter.set(value);
        counter.expireAt(expireTime);
    }

    /**
     * 设置原子自增长的key-value
     * @param key 名称
     * @param value 设置的值
     * @param timeout 超时时长
     * @param unit 时间单位
     */
    public void set(String key,int value,long timeout,TimeUnit unit) {
        RedisAtomicLong counter = new RedisAtomicLong(key, mRedisTemp.getConnectionFactory());
        counter.set(value);
        counter.expire(timeout, unit);
    }

    /**
     * 以当前原子值自增
     * @param key 取值所使用的key
     * @return 自增后的值
     */
    public long generate(String key) {
        RedisAtomicLong counter = new RedisAtomicLong(key, mRedisTemp.getConnectionFactory());
        return counter.incrementAndGet();
    }

    /**
     * 以当前原子值自增
     * @param key 取值所使用的key
     * @param expireTime 超时时间
     * @param initValue 初始值
     * @param length 尾号长度
     * @return 自增后的值
     */
    public long generate(String key,Date expireTime, long initValue, int length) {
        RedisAtomicLong counter = new RedisAtomicLong(key, mRedisTemp.getConnectionFactory());
        counter.expireAt(expireTime);

        long incr = counter.incrementAndGet();
        if (String.valueOf(incr).length() < length) {
            incr = initValue;
            set(key, Integer.valueOf(String.valueOf(incr)), expireTime);
        }
        return incr;
    }

    /**
     * 以当前原子值自增
     * @param key 取值所使用的key
     * @param increment 自增步长
     * @return 增长后的值
     */
    public long generate(String key,int increment) {
        RedisAtomicLong counter = new RedisAtomicLong(key, mRedisTemp.getConnectionFactory());
        return counter.addAndGet(increment);
    }

    /**
     * 以当前原子值自增
     * @param key 取值所使用的key
     * @param increment 自增步长
     * @param expireTime 超时时间
     * @return 增长后的值
     */
    public long generate(String key,int increment,Date expireTime) {
        RedisAtomicLong counter = new RedisAtomicLong(key, mRedisTemp.getConnectionFactory());
        counter.expireAt(expireTime);
        return counter.addAndGet(increment);
    }
}